/*
 * Constantes.h
 *
 *  Created on: 28/09/2011
 *      Author: utn_so
 */

#ifndef CONSTANTES_H_
#define CONSTANTES_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <string.h>
#include <semaphore.h>
#include <errno.h>
#include <fcntl.h> //para el O_CREAT de semaforos
#include <signal.h>
#include <sched.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/poll.h>
#include "utils/log.h"
#include "utils/Class.h"
#include "utils/Collections.h"
#include "utils/Configuration.h"
#include "utils/File.h"
#include "utils/HashMap.h"
#include "utils/NString.h"
#include "utils/Object.h"



#define PUERTO_SERVER_PPD 5300
#define PUERTO_SERVER_PFS 5301
#define CANT_CLIENTES_PFS_MAXI 30
#define CANT_CLIENTES_PPD_MAX 10
//#define LECTURA 1
//#define ESCRITURA 2
#define TRUE 1
#define FALSE 0

#define LISTO 1
#define SINCRONIZANDO 0
#define MUERTO 2

#define TIME_24   1
#define TIME_12   0
#define LONG_PLANIFICADOR_ID   25
#define LONG_ERROR 40
//#define CANTIDADSECTORES = 1024;

enum NIPC_TYPE {HANDSHAKE=0,
				LECTURA=1,
				LECTURA_OK = 11,
				ESCRITURA=2,
				ESCRITURA_OK=21,
				LECTURA_ERROR=10,
				ESCRITURA_ERROR=20
};

typedef struct t_pedido {
		char lectura_o_escritura;
		int32_t direccionSector;
        char planificador_id[25];
        int32_t conexion_ppd_id;
        int32_t conexion_pfs_id;
        char info[512];
        }__attribute__ ((__packed__)) t_pedido;

typedef struct NodoPFS{
		int32_t cliente_pfs;
		int32_t cantidadClientes;
		struct NodoPFS *sig;
        }__attribute__ ((__packed__)) NodoPFS;

typedef struct t_nodoCola {
		struct t_pedido pedido;
		struct t_nodoCola *siguiente;
		}__attribute__ ((__packed__)) t_nodoCola;

typedef struct t_nodoColaGrande {
		sem_t semaforo_cola;
		sem_t semaforo_escritura;
		int32_t estado;
		pthread_mutex_t mutex_ppd;
		pthread_mutex_t mutex_en_proceso;
		char planificador_id[25];
		pthread_t thread_id;
		int32_t socket_id;
		t_nodoCola *siguiente;
		t_nodoCola *ultimo;
		int32_t ppd_muerto;
		t_nodoCola *pedidos_en_proceso;
		t_nodoCola *ultimo_en_proceso;
		struct t_nodoColaGrande *siguienteGrande;
		}__attribute__ ((__packed__)) t_nodoColaGrande;

typedef struct protocoloNIPC{
		int32_t type;
		int32_t payloadlength;
		t_pedido payload;
		}__attribute__ ((__packed__)) nipc;

typedef struct estructuraThread {
		t_nodoColaGrande **frenteColaGrande;
		t_nodoColaGrande **finColaGrande;
		char planificador_id[25];
		int32_t socket_id;
		//conexion_id
		}__attribute__ ((__packed__)) estructuraThread;

typedef struct t_infoConsola {
		int32_t inicioRaid;
		int32_t nuevoPlanificador;
		int32_t desconexion;
		char planificadorNuevo_id[25];
		int32_t iSincronizacion;
		int32_t fSincronizacion;
		time_t inicioSincronizacion;
		time_t finSincronizacion;
		int32_t escritura;
		int32_t sector;
		int32_t lectura;
		char planificador_id[25];
		}__attribute__ ((__packed__)) t_infoConsola;

typedef struct consola{
		t_infoConsola *infoConsola;
		pthread_t thread_consola_id;
		}consola;

typedef struct configuracion{
	char IPRAID[16];
	int32_t PuertoEscuchaPfs;
	int32_t PuertoEscuchaPpd;
	int32_t ConsolaActiva;
	int32_t logActivado;
	int32_t cantPFSMax;
}__attribute__ ((__packed__)) config;

#endif /* CONSTANTES_H_ */
